from selenium import webdriver  # # 驱动浏览器
from selenium.webdriver.common.by import By  # 选择器
from selenium.webdriver.common.keys import Keys  # 按键
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载完毕，寻找某些元素
from selenium.webdriver.support import expected_conditions as EC  ##等待指定标签加载完毕
import time
from lxml import etree
from openpyxl import workbook   # 调出excel


class WangYi():
    def __init__(self):
        # 1,驱动浏览器
        self.browser = webdriver.Chrome()
        self.wb = workbook.Workbook()  # 创建excel对象
        self.ws = self.wb.active  # 激活表对象
        self.ws.append(['标题'])

    def get_data(self):
        # 2，请求页面   --返回的数据封装在了browser对象里，不需要额外的变量接收
        self.browser.get('https://news.163.com/')  # 调用浏览器驱动访问站点
        # 等待页面加载完毕 -- 怕网速慢
        time.sleep(1.5)
        # 3，拿到航空所在class标签
        text_input = self.browser.find_element(By.CLASS_NAME, 'menu_hangkong')
        # 对航空进行点击操作
        text_input.click()
        # 应为是在原页面进行点击，点击之后出现的是新页面，所以要切换到新页面进行操作，代码如下
        self.browser.switch_to.window(self.browser.window_handles[1])
        # 获取页面源码
        html_demo = self.browser.page_source
        # print(html_demo)
        return html_demo
        # print(html_demo)


        # print(html_demo)

    def paser_data(self, html_demo):
        # 将滚动条拖动到最底部
        for i in range(3):
            move = 'window.scrollTo(0,document.body.scrollHeight)'  # 滑动到底部
            self.browser.execute_script(move)
            time.sleep(3)
        # 为判断页面下拉距离设置一个初始值
        check_height = 0
        # 进入循环
        while True:
            # 页面无限下拉
            js = 'window.scrollTo(0,document.body.scrollHeight)'
            # 运行js代码
            self.browser.execute_script(js)
            # 沉睡，让滚动条有所反应
            time.sleep(3)
            # 测试出滚动条距离页面顶端的距离
            finally_height = self.browser.execute_script("return document.documentElement.scrollHeight || document.body.scrollHeight;")
            # 开始进行判断
            if check_height == finally_height:
                # 如果页面下拉距离与初始值相等，即退出下拉循环
                break
            else:
                # 否则，将下拉值给初始值，为下一次下拉循环做准备
                check_height = finally_height
        # 利用xpath对其进行解析
        xm = etree.HTML(html_demo)
        # print(type(xm))
        # 标题
        titles = xm.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div/div/div[1]/h3/a/text()')
        for tit in titles:
            print(tit)
            self.save_data(tit)
        # print(titles)
        # 时间
        # times = xm.xpath('//div[@class="news_tag"]/span')
        # print(times)
        # for title,tie in zip(titles,times):
        #     print(title.xpath('string(.)'))
        #
        #     print(tie.xpath('string(.)'))
    def save_data(self,tit):
        my_list = [tit]  # 以列表形式写入数据
        self.ws.append(my_list)
        self.wb.save("新闻.xlsx")  # 保存


if __name__ == '__main__':
    a = WangYi()
    # a.get_data()
    b = a.get_data()
    a.paser_data(b)

